package springsecurityrabclogin.result;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 企业项目开发中的常用做法
 *
 * 采用R类封装后端返回的结果 （不管后端返回什么数据，都用R封装，这样可以使得后端返回的数据结构是统一的）
 */
@Slf4j //日志注解
//@Builder //生成构建器模式的代码，这样可以采用链式编程创建对象
//@NoArgsConstructor //无参构造器
//@AllArgsConstructor //所有参数的构造器
//@Data
public class R {

    private int code; //结果码

    private String msg; //结构信息

    private Object info; //结果数据 （结果类型可能是string，也可能是user对象，也可能是List

    public R() {
    }

    public R(int code, String msg, Object info) {
        this.code = code;
        this.msg = msg;
        this.info = info;
    }

    public  static R OK(){
        //对象中的字段本身就是一个方法，通过该方法给对象设置数据
        //1.拿到构建器
        //2.给各个字段设置数据
        //3.调用build方法构建该对象
        return R.builder().code(200).msg("成功").info(null).build();
    }

    public  static R fail(){
        //对象中的字段本身就是一个方法，通过该方法给对象设置数据
        //1.拿到构建器
        //2.给各个字段设置数据
        //3.调用build方法构建该对象
        return R.builder().code(500).msg("失败").info(null).build();
    }


    /**
     * 获取
     * @return code
     */
    public int getCode() {
        return code;
    }

    /**
     * 设置
     * @param code
     */
    public void setCode(int code) {
        this.code = code;
    }

    /**
     * 获取
     * @return msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置
     * @param msg
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 获取
     * @return info
     */
    public Object getInfo() {
        return info;
    }

    /**
     * 设置
     * @param info
     */
    public void setInfo(Object info) {
        this.info = info;
    }

    public String toString() {
        return "R{code = " + code + ", msg = " + msg + ", info = " + info + "}";
    }

    // 建造者模式实现
    public static class RBuilder {
        private int code;
        private String msg;
        private Object info;

        public RBuilder code(int code) {
            this.code = code;
            return this;
        }

        public RBuilder msg(String msg) {
            this.msg = msg;
            return this;
        }

        public RBuilder info(Object info) {
            this.info = info;
            return this;
        }


        public R build() {
            return new R(code, msg, info);
        }
    }

    public static RBuilder builder() {
        return new RBuilder();
    }

}
